﻿using System;
using System.Collections.Generic;
using SisEagle.Common.Code.Utils;
using System.Reflection;
using SisEagle.Common.Code;
using SisEagle.View.Web.UserControl;
using SisEagle.View.Web.Seguranca;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

namespace SisEagle.View.Web.Base
{
    public class WebPageBase:System.Web.UI.Page
    {
        /// <summary>
        /// Singleton da Classe de Validacoes
        /// </summary>
        #region Singleton
        public UtilsNum _UtilsNum;
        public UtilsNum UtilsNumber
        {
            get
            {
                if(_UtilsNum == null)
                    _UtilsNum = new UtilsNum();

                return _UtilsNum;
            }
        }

       
        public UcBotoesCadastro _UcBotoesCadastro;
        public UcBotoesCadastro UcBotoesCadastro
        {
            get
            {
                if(_UcBotoesCadastro == null)
                    _UcBotoesCadastro = new UcBotoesCadastro();

                return _UcBotoesCadastro;
            }

        }
      
        
        #endregion
      
        #region Metodos

        public WebPageBase()
        {
            Mensagens = new List<Mensagem>();


        }

        /// <summary>
        /// Implementa o totalizador no GridView
        /// </summary>
        /// <param name="QantidadeRegistro"> Parametro vindo da ListaResultado.Count</param>
        /// <param name="Totalizador1"> Primeiro Totalizador</param>
        /// <param name="Totalizador1">Segundo Totalizador</param>
        /// <param name="e"></param>
        public void AjustaTotalizador(int QantidadeRegistro, int? posicao1, string Totalizador1, int? posicao2, string Totalizador2, GridViewRowEventArgs e)
        {
            if (!string.IsNullOrEmpty(Totalizador1))
            {
                //Totaliza a Valor do Totalizador
                Total = Total + Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, Totalizador1));
            }

            if (!string.IsNullOrEmpty(Totalizador2))
            {
                //Totaliza a Valor do Totalizador
                Total2 = Total2 + Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, Totalizador2));
            }
            //Quando a Linha for o Footer
            if (e.Row.RowType == DataControlRowType.Footer)
            {
                e.Row.Cells[0].Text = string.Format("Total de registros:{0}", QantidadeRegistro.ToString());
                e.Row.Cells[0].HorizontalAlign = HorizontalAlign.Left;
                e.Row.ControlStyle.Height = 25;
                e.Row.ForeColor = Color.Red;
                e.Row.Font.Size = 10;
                e.Row.Font.Bold = true;

                if (!string.IsNullOrEmpty(Totalizador1))
                {
                    if (posicao1.HasValue)
                    {
                        e.Row.Cells[posicao1.Value].HorizontalAlign = HorizontalAlign.Left;
                        e.Row.Cells[posicao1.Value].Text = string.Format("Total:{0}", Total.ToString());
                    }
                }
                if (!string.IsNullOrEmpty(Totalizador2))
                {
                    if (posicao2.HasValue)
                    {
                        e.Row.Cells[posicao2.Value].HorizontalAlign = HorizontalAlign.Left;
                        e.Row.Cells[posicao2.Value].Text = string.Format("Total:{0}", Total2.ToString());
                    }
                }
            }
        }


        /// <summary>
        /// Executa o redirecionamento quando necessário
        /// </summary>
        /// <param name="HasErro">Ocorrerão erros</param>
        public void Redireciona(bool HasErro)
        {
            if(!HasErro && RedirecionaSalvar != Redirecionamento.NaoRedirecionar)
            {
                Response.Redirect(RedirecionaSalvar == Redirecionamento.PaginaAtual ? PaginaAtual : PaginaLista);
            }
        }

        #endregion

        #region ViewState
        /// <summary>
        /// Recupera o ViewState e define os valores das propriedades marcadas com o atributo PersistToViewState
        /// </summary>
        /// <param name="savedState"></param>
        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);
            PropertyInfo[] properties = GetType().GetProperties();
            foreach(PropertyInfo property in properties)
            {
                object[] attributes = property.GetCustomAttributes(typeof(SaveInViewStateAttribute),true);
                if(attributes.Length > 0)
                {
                    if(ViewState[property.Name] != null)
                        property.SetValue(this,ViewState[property.Name],null);
                }
            }

            EnsureChildControls();
        }

        /// <summary>
        /// Sobrescreve o save do ViewState adicionando as propriedades marcadas com o atributo PersistToViewState
        /// </summary>
        /// <returns></returns>
        protected override object SaveViewState()
        {
            PropertyInfo[] properties = GetType().GetProperties();
            foreach(PropertyInfo property in properties)
            {
                object[] attributes = property.GetCustomAttributes(typeof(SaveInViewStateAttribute),true);
                if(attributes.Length > 0)
                    ViewState[property.Name] = property.GetValue(this,null);
            }

            return base.SaveViewState();
        }
        #endregion

        #region Propriedades
        public string PaginaLista { get; set; }

        /// <summary>
        /// Get ou Set da pagina atual, será utilizada ao criar um novo registro
        /// </summary>
        /// 

        public string PaginaAtual { get; set; }

        /// <summary>
        /// Get ou Set se pagina deve ser redirecionada ao salvar
        /// </summary>
        public Redirecionamento RedirecionaSalvar { get; set; }


        public List<Mensagem> Mensagens { get; set; }


        public Mensagem mensagemJS { get; set; }

        /// <summary>
        /// Indica se a operação contém erros, o controle do valor e interno.
        /// </summary>
        public bool Erro { get; set; }


        public bool ExisteUsuario { get; set; }

        [SaveInViewState]
        private decimal Total { get; set; }

        [SaveInViewState]
        private decimal Total2 { get; set; }

        #endregion
        
    }
}